/**
 * app - 扩展项目中用到的常用方法
 *
 * Dependencies: jquery
 *
 */
jQuery.app = {
    // 返回带/的工程根目录
    basePath: (function (win) {
        var hasContext = false;
        if (hasContext) {
            var pathname = win.location.pathname;
            return pathname.substring(0, pathname.indexOf('/', 1));
        } else {
            return '';
        }
    })(window),

    // 控制是否打印日志
    debug: false,

    // 打印日志方法
    info: function () {
        if (jQuery.app.debug && console && console.info) {
            console.info(arguments);
        }
    },

    // 格式话字符串。调用：$.app.formatString('hello, {0}!', 'world');
    formatString: function (str) {
        for (var i = 0; i < arguments.length - 1; i++) {
            str = str.replace(new RegExp('\\{' + i + '\\}', 'g'), arguments[i + 1]);
        }
        return str;
    },

    // 创建新命名空间，或返回已存在的命名空间。调用：$.app.namespace('$.easyui');
    namespace: function (obj, namespace) {
        var index = 0, ret;
        if (typeof obj == 'string') {
            ret = window;
        } else {
            ret = obj || window;
            index++;
        }
        namespace = arguments[index++];

        if (!namespace) {
            return ret;
        }
        var names = String(namespace).split("."), n;
        for (var i = 0; i < names.length; i++) {
            n = names[i].trim();
            if (n !== '') {
                ret = ret[n] ? ret[n] : (ret[n] = {});
            }
        }
        return ret;
    },

    downloadFile: function (fileName, filePath) {
        var $download_form = $("#downloadForm");
        if ($download_form.length === 0) {
            var html = "<form id='downloadForm' method='post' action='" + $.app.basePath + "/file/download' style='display:none;'>";
            html += "<input name='fileName' type='hidden'/>";
            html += "<input name='filePath' type='hidden'/>";
            html += "</form>";
            $("body").append(html);
            $download_form = $("#downloadForm");
        }
        $download_form.find("[name=fileName]").val(fileName);
        $download_form.find("[name=filePath]").val(filePath);
        $download_form.submit();
    }
};

(function ($) {

    $.extend({
        // 提示信息
        showMsg: function (msg) {
            $.easyui.messager.show({
                height: 45,
                width: 'auto',
                timeout: 3000,
                showSpeed: 200,
                msg: '<i class="fa fa-info-circle" style="color:green;"></i>&nbsp;' + (msg || '这是一条提示消息这是一条提示消息这是一条提示消息'),
                style: {
                    top: document.body.scrollTop + document.documentElement.scrollTop + 20,
                    'z-index': 999,
                    'padding': '2px 5px',
                    'box-shadow': '0 1px 6px rgba(0,0,0,.2)'
                }
            });
        },
        // 报错信息
        errorMsg: function (errorMsg) {
            $.easyui.messager.alert('错误提示', errorMsg, 'error');
        },
        dataFilter: function (data) {
            if (data && data.status) {
                if (data.status === '200') {
                    return data.data;
                } else {
                    this.errorMsg(data.msg);
                }
                return null;
            }
            return data;
        },
        confirmMsg: function (confirmMsg, okCallback, noCallback) {
            $.messager.confirm('确认', confirmMsg, function (r) {
                if (r) {
                    if (okCallback) {
                        okCallback();
                    }
                } else {
                    if (noCallback) {
                        noCallback();
                    }
                }
            });
        },
        showProgress: function () {
            $.easyui.messager.progress({
                title: '提示',
                msg: '数据处理中，请稍后....'
            });
        },
        closeProgress: function () {
            $.easyui.messager.progress('close');
        },
        /**
         * 请求结果处理，调用：$.dealResultData(data, callback);
         *
         * @param data json 对象
         * @param callback( data.data) 回调函数
         */
        dealResultData: function (data, callback) {
            if (data && data.status) {
                if (data.status === '200') {
                    $.showMsg(data.msg);
                    if (typeof callback === 'function') {
                        callback(data.data);// 自定义动作
                    }
                } else {
                    $.errorMsg(data.msg);
                }
            } else {
                $.errorMsg('响应结果不是预期[object]!!!');
            }
        }
    });

    $.fn.extend({
        /**
         * 序列化查询表单 返回：{ param1 : value1, param2 : value2, ...}，调用$this.serializeForm();
         */
        serializeForm: function () {
            var $this = this, obj = {};
            $.each($this.serializeArray(), function (i, o) {
                if (obj[o.name]) {
                    obj[o.name] = obj[o.name] + "," + o.value;
                } else {
                    obj[o.name] = o.value;
                }
            });
            return obj;
        },
        /**
         * Easyui 表单提交，调用$this.submitEForm(url, data, callback);
         * @param url
         * @param data
         * @param callback
         */
        submitEForm: function (url, data, callback) {
            var $this = this;
            var validate = $this.form('validate');
            if (validate) {
                if (!data) {
                    data = $this.serializeForm();
                }
                $.showProgress();
                $.ajax({
                    type: url.method || 'POST',
                    url: url.url || url,
                    data: data,
                    dataType: 'json',
                    success: function (data, textStatus, jqXHR) {
                        $.closeProgress();
                        $.dealResultData(data, callback);
                    },
                    error: function (XMLHttpRequest, textStatus, errorThrown) {
                        // 通常 textStatus 和 errorThrown 之中
                        // 只有一个会包含信息
                        this; // 调用本次AJAX请求时传递的options参数
                        $.closeProgress();
                        $.dealResultData(XMLHttpRequest.responseJSON);
                    }
                });
            } else {
                $.showMsg('表单校验不通过');
            }
        }
    });
})(jQuery);


var CTX = $.app.basePath;
// 输出log日志
$.app.debug = true;
// 创建命名空间
$.app.namespace('$.easyui');
$.easyui.messager = top.$.messager;

/**
 * Ajax请求出错时注册一个回调处理函数
 */
$(document).ajaxError(function (event, jqXHR, ajaxSettings, thrownError) {
    $.app.info('Ajax 请求异常', event, jqXHR, ajaxSettings, thrownError);
});

/**
 * 为以后要用到的Ajax请求设置默认的值
 */
$.ajaxSetup({
    statusCode: {
        404: function () {
            $.errorMsg('请求路径不存在');
        }
    }
});
